Appearance
Apache ActiveMQ Artemis
ActiveMQ 的下一代消息代理
安装
下载 2.19.1(支持 JDK 1.8 的版本)并解压
创建一个代理实例
代理实例是包含与代理流程关联的所有配置和运行时数据(如日志和消息日志)的目录。建议您不要在 ${ARTEMIS_HOME}
下创建实例目录。
在 Unix 系统上,通常将这种运行时数据存储在 /var/lib/ 目录下。例如,要在 /var/lib/mybroker/ 创建一个实例,请在命令行 shell 中执行以下命令:
sh
$ cd /var/lib
$ ${ARTEMIS_HOME}/bin/artemis create mybroker
一个代理实例目录将包含以下子目录:
bin
:包含与此实例关联的执行脚本。data
:包含用于存储持久消息的数据文件。etc
:包含实例配置文件。lib
:包含任何自定义运行时 Java 依赖,如转换器、插件、拦截器等。log
:包含切割日志文件。tmp
:包含代理运行期间可以安全删除的临时文件。
启动和停止代理实例
假设你在 /var/lib/mybroker/ 下创建了代理实例,你需要做的就是开始运行代理实例:
sh
$ /var/lib/mybroker/bin/artemis run
要停止 Apache ActiveMQ Artemis 实例,您将使用相同的 Artemis 脚本,但带有 stop
参数。例子:
sh
$ /var/lib/mybroker/bin/artemis stop
Apache ActiveMQ Artemis 默认的控制台地址:http://localhost:8161/console
使用 spring-boot-starter-artemis
添加依赖:
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-artemis</artifactId>
</dependency>
配置 Artemis 属性
properties
# 代理的 URL
spring.artemis.broker-url=tcp://localhost:61616
使用 JmsTemplate
设置默认目的地
properties# 默认目的地 spring.jms.template.default-destination=hello-world
使用 JmsTemplate 发送消息
java
package study.helloworld.spring.jms.send;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Component;
import study.helloworld.spring.jms.dto.MessageDTO;
@Component
public class Sender {
@Autowired
private JmsTemplate jmsTemplate;
public void send(MessageDTO messageDTO) {
// 使用默认目的地。手动使用 MessageCreator 来生成 Message 对象
jmsTemplate.send(session -> session.createObjectMessage(messageDTO));
// 指定目的地。自动使用 MessageConverter 将 Object 转换为 Message,默认情况下,将会使用
// SimpleMessageConverter,需要被发送的对象实现 Serializable
jmsTemplate.convertAndSend("world", messageDTO);
// 指定目的地。设置消息的属性
jmsTemplate.convertAndSend("study", messageDTO, message -> {
message.setStringProperty("x_source", "web");
return message;
});
}
}
使用 JmsTemplate 接收消息
主动拉取
java
package study.helloworld.spring.jms.receive;
import javax.jms.JMSException;
import javax.jms.Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Component;
import study.helloworld.spring.jms.dto.MessageDTO;
@Component
public class Receiver {
private static final Logger LOGGER = LoggerFactory
.getLogger(Receiver.class);
@Autowired
private JmsTemplate jmsTemplate;
public void receive() {
try {
Message message = jmsTemplate.receive();
MessageDTO messageDTO = message.getBody(MessageDTO.class);
LOGGER.info("default destination messageDTO={}", messageDTO);
} catch (JMSException e) {
e.printStackTrace();
}
MessageDTO messageDTO = (MessageDTO) jmsTemplate
.receiveAndConvert("world");
LOGGER.info("world destination messageDTO={}", messageDTO);
try {
Message message = jmsTemplate.receive("study");
String stringProperty = message.getStringProperty("x_source");
LOGGER.info("study destination property x_source={}",
stringProperty);
} catch (JMSException e) {
e.printStackTrace();
}
}
}
被动监听
java
package study.helloworld.spring.jms.receive;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
import study.helloworld.spring.jms.dto.MessageDTO;
@Component
public class MessageListener {
private static final Logger LOGGER = LoggerFactory
.getLogger(MessageListener.class);
@JmsListener(destination = "hello")
public void receiveHello(MessageDTO messageDTO) {
LOGGER.info("hello destination messageDTO={}", messageDTO);
}
@JmsListener(destination = "world")
public void receiveWorld(MessageDTO messageDTO) {
LOGGER.info("world destination messageDTO={}", messageDTO);
}
@JmsListener(destination = "study")
public void receiveStudy(MessageDTO messageDTO) {
LOGGER.info("study destination messageDTO={}", messageDTO);
}
}